import PyInstaller.__main__
import os
import shutil
import sys


def build_app():
    try:
        # 清理之前的构建
        if os.path.exists('dist'):
            shutil.rmtree('dist')
        if os.path.exists('build'):
            shutil.rmtree('build')

        # 删除之前的spec文件
        spec_file = 'CursorTask.spec'
        if os.path.exists(spec_file):
            os.remove(spec_file)

        # 确保assets目录存在
        if not os.path.exists('assets'):
            os.makedirs('assets')

        # 确保assets/pages目录存在
        pages_dir = os.path.join('assets', 'pages')
        if not os.path.exists(pages_dir):
            os.makedirs(pages_dir)

        # PyInstaller参数
        params = [
            'client.py',  # 主程序
            '--name=CursorTask',  # 程序名称
            '--onefile',  # 打包成单个文件
            '--noconsole',  # 不显示控制台
            f'--add-data=assets{os.pathsep}assets',  # 添加资源文件，使用系统路径分隔符
            '--icon=assets/icon.ico',  # 程序图标
            # Web框架相关
            '--hidden-import=fastapi',
            '--hidden-import=uvicorn',
            '--hidden-import=uvicorn.logging',
            '--hidden-import=uvicorn.protocols',
            '--hidden-import=uvicorn.lifespan',
            '--hidden-import=uvicorn.lifespan.on',
            '--hidden-import=uvicorn.protocols.http',
            '--hidden-import=starlette',
            '--hidden-import=pydantic',
            # WebView相关
            '--hidden-import=webview',
            '--hidden-import=clr',
            '--hidden-import=pythonnet',
            # 工具库
            '--hidden-import=psutil',
            '--hidden-import=requests',
            '--hidden-import=json',
            '--hidden-import=threading',
            # 项目自定义模块
            '--hidden-import=common.reset_machine',
            '--hidden-import=common.update_cursor_token',
            '--hidden-import=routers.cursor',
            '--clean',  # 清理临时文件
        ]

        print("开始打包...")
        print("检查资源文件...")

        # 检查必要的资源文件
        required_files = [
            os.path.join('assets', 'login.html'),
            os.path.join('assets', 'register.html'),
            os.path.join('assets', 'sidebar.html'),
            os.path.join('assets', 'pages', 'main_page.html'),
            os.path.join('assets', 'pages', 'user_token_record.html'),
            os.path.join('assets', 'icon.ico')
        ]

        missing_files = [f for f in required_files if not os.path.exists(f)]
        if missing_files:
            print("\n警告：以下文件缺失：")
            for f in missing_files:
                print(f"- {f}")
            if input("\n是否继续打包？(y/n): ").lower() != 'y':
                print("打包已取消")
                return

        print("\n开始打包，这可能需要几分钟时间，请耐心等待...")

        # 执行打包
        PyInstaller.__main__.run(params)

        print("\n打包完成！")
        print(f"可执行文件位置: {os.path.abspath(os.path.join('dist', 'CursorTask.exe'))}")

    except Exception as e:
        print(f"\n打包过程中出现错误: {str(e)}")
        sys.exit(1)


if __name__ == '__main__':
    build_app()
